import 'package:get_it/get_it.dart';
import 'package:mobile_app.core/injection_container.dart' as core_di;
import 'package:mobile_app.home.core/injection_container.dart' as home_core_di;
import 'package:mobile_app.home.learning.core/injection_container.dart' as learning_core_di;
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/apply_lexical_item_mark_as_badly_remembered/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/apply_lexical_item_mark_as_remembered/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/apply_lexical_item_mark_as_unremembered/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/generate_card_info/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_card_info_lexical_item/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_card_info_repeatable_lexical_item_id/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_card_info_unspecified_lexical_item_id/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_high_priority_lexical_item_ids/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_memorization_card_actions/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_repetition_answer_selection_exposed_card_actions/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/get_unspecified_lexical_item_exposed_card_actions/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/is_skip_card_action_permitted/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/pick_repeatable_lexical_item/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/helpers/pick_unspecified_lexical_item/helper.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/add_memorization_card_lexical_item_to_custom_collection/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/add_repetition_answer_selection_exposed_card_lexical_item_to_custom_collection/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/add_unspecified_lexical_item_exposed_card_lexical_item_to_custom_collection/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/close_memorization_card/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/disable_repetition_answer_typing_card_typing_mode/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/enable_repetition_answer_selection_obscure_card_typing_mode/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/exclude_memorization_card_lexical_item_from_learning/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/exclude_repetition_answer_selection_exposed_card_lexical_item_from_learning/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/exclude_unspecified_lexical_item_exposed_card_lexical_item_from_learning/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/expose_repetition_answer_selection_obscure_card/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/expose_unspecified_lexial_item_obscure_card/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/get_initial_data/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_available_email_app_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_cached_image_path_map_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_dialect_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_image_settings_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_learning_content_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_premium_access_status_outer_update/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_repetition_answer_typing_card_correct_answer/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/handle_repetition_answer_typing_card_hint_usage/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/initialize/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_repetition_answer_selection_exposed_card_lexical_item_as_badly_remembered/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_repetition_answer_selection_exposed_card_lexical_item_as_completely_learned/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_repetition_answer_selection_exposed_card_lexical_item_as_remembered/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_repetition_answer_selection_exposed_card_lexical_item_as_unremembered/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_repetition_answer_typing_card_lexical_item_as_unremembered/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_unspecified_lexical_item_exposed_card_lexical_item_as_known/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/mark_unspecified_lexical_item_exposed_card_lexical_item_as_unknown/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/maybe_auto_pronounce_memorization_card_lexical_item/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/maybe_auto_pronounce_repetition_answer_selection_exposed_card_lexical_item/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/maybe_auto_pronounce_unspecified_lexical_item_obscure_card_lexical_item/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/report_memorization_card_lexical_item_mistake_by_email/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/report_repetition_answer_selection_exposed_card_lexical_item_mistake_by_email/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/report_unspecified_lexical_item_exposed_card_lexical_item_mistake_by_email/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/reset_memorization_card_lexical_item_progress/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/reset_repetition_answer_selection_exposed_card_lexical_item_progress/use_case.dart';
import 'package:mobile_app.home.learning.spaced_repetitions/spaced_repetition_page/domain/use_cases/skip_unspecified_lexical_item_exposed_card/use_case.dart';

final sl = GetIt.asNewInstance();

Future<void> init() async {
  // domain helpers

  sl.registerLazySingleton<ApplyLexicalItemMarkAsBadlyRemembered>(() {
    return const ApplyLexicalItemMarkAsBadlyRememberedImpl();
  });

  sl.registerLazySingleton<ApplyLexicalItemMarkAsRemembered>(() {
    return const ApplyLexicalItemMarkAsRememberedImpl();
  });

  sl.registerLazySingleton<ApplyLexicalItemMarkAsUnremembered>(() {
    return const ApplyLexicalItemMarkAsUnrememberedImpl();
  });

  sl.registerLazySingleton<GenerateCardInfo>(() {
    return GenerateCardInfoImpl(
      getAvailableForFirstTrainingLexicalItemLimit: learning_core_di.sl(),
      getHighPriorityLexicalItemIds: sl(),
      getLearnableLearningQueue: learning_core_di.sl(),
      getLearnableUnknownLexicalItems: learning_core_di.sl(),
      getLearnableUnspecifiedLexicalItemIds: learning_core_di.sl(),
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
      getRepeatableLexicalItems: learning_core_di.sl(),
      getRetrainableLexicalItems: learning_core_di.sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      pickRepeatableLexicalItem: sl(),
      pickUnspecifiedLexicalItem: sl(),
    );
  });

  sl.registerLazySingleton<GetCardInfoLexicalItem>(() {
    return const GetCardInfoLexicalItemImpl();
  });

  sl.registerLazySingleton<GetCardInfoRepeatableLexicalItemId>(() {
    return const GetCardInfoRepeatableLexicalItemIdImpl();
  });

  sl.registerLazySingleton<GetCardInfoUnspecifiedLexicalItemId>(() {
    return const GetCardInfoUnspecifiedLexicalItemIdImpl();
  });

  sl.registerLazySingleton<GetHighPriorityLexicalItemIds>(() {
    return GetHighPriorityLexicalItemIdsImpl(
      isCollectionSelectionEffective: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<GetMemorizationCardActions>(() {
    return GetMemorizationCardActionsImpl(
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
      createAdditionToCustomCollectionCardActionIfReasonable: home_core_di.sl(),
      createEditingCardActionIfReasonable: home_core_di.sl(),
      createExclusionFromLearningCardActionIfReasonable: home_core_di.sl(),
      createMistakeReportCardActionIfReasonable: home_core_di.sl(),
      createProgressResetCardActionIfReasonable: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<GetRepetitionAnswerSelectionExposedCardActions>(() {
    return GetRepetitionAnswerSelectionExposedCardActionsImpl(
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
      createAdditionToCustomCollectionCardActionIfReasonable: home_core_di.sl(),
      createEditingCardActionIfReasonable: home_core_di.sl(),
      createExclusionFromLearningCardActionIfReasonable: home_core_di.sl(),
      createMistakeReportCardActionIfReasonable: home_core_di.sl(),
      createProgressResetCardActionIfReasonable: home_core_di.sl(),
      createMarkAsCompletelyLearnedCardActionIfReasonable: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<GetUnspecifiedLexicalItemExposedCardActions>(() {
    return GetUnspecifiedLexicalItemExposedCardActionsImpl(
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
      createAdditionToCustomCollectionCardActionIfReasonable: home_core_di.sl(),
      createEditingCardActionIfReasonable: home_core_di.sl(),
      createExclusionFromLearningCardActionIfReasonable: home_core_di.sl(),
      createMistakeReportCardActionIfReasonable: home_core_di.sl(),
      isSkipCardActionPermitted: sl(),
    );
  });

  sl.registerLazySingleton<IsSkipCardActionPermitted>(() {
    return const IsSkipCardActionPermittedImpl();
  });

  sl.registerLazySingleton<PickRepeatableLexicalItem>(() {
    return const PickRepeatableLexicalItemImpl();
  });

  sl.registerLazySingleton<PickUnspecifiedLexicalItem>(() {
    return const PickUnspecifiedLexicalItemImpl();
  });

  // use cases

  sl.registerLazySingleton<AddMemorizationCardLexicalItemToCustomCollection>(() {
    return AddMemorizationCardLexicalItemToCustomCollectionImpl(
      applyCollectionListItemUpdate: home_core_di.sl(),
      applyLexicalItemAdditionToCustomCollection: home_core_di.sl(),
      getMemorizationCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<AddRepetitionAnswerSelectionExposedCardLexicalItemToCustomCollection>(
      () {
    return AddRepetitionAnswerSelectionExposedCardLexicalItemToCustomCollectionImpl(
      applyCollectionListItemUpdate: home_core_di.sl(),
      applyLexicalItemAdditionToCustomCollection: home_core_di.sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<AddUnspecifiedLexicalItemExposedCardLexicalItemToCustomCollection>(() {
    return AddUnspecifiedLexicalItemExposedCardLexicalItemToCustomCollectionImpl(
      applyCollectionListItemUpdate: home_core_di.sl(),
      applyLexicalItemAdditionToCustomCollection: home_core_di.sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<CloseMemorizationCard>(() {
    return CloseMemorizationCardImpl(
      generateCardInfo: sl(),
      getCardInfoLexicalItem: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<DisableRepetitionAnswerTypingCardTypingMode>(() {
    return DisableRepetitionAnswerTypingCardTypingModeImpl(
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<EnableRepetitionAnswerSelectionObscureCardTypingMode>(() {
    return EnableRepetitionAnswerSelectionObscureCardTypingModeImpl(
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ExcludeMemorizationCardLexicalItemFromLearning>(() {
    return ExcludeMemorizationCardLexicalItemFromLearningImpl(
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      applyLexicalItemExclusionFromLearning: home_core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      generateCardInfo: sl(),
      getMemorizationCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ExcludeRepetitionAnswerSelectionExposedCardLexicalItemFromLearning>(() {
    return ExcludeRepetitionAnswerSelectionExposedCardLexicalItemFromLearningImpl(
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      applyLexicalItemExclusionFromLearning: home_core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      generateCardInfo: sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ExcludeUnspecifiedLexicalItemExposedCardLexicalItemFromLearning>(() {
    return ExcludeUnspecifiedLexicalItemExposedCardLexicalItemFromLearningImpl(
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      applyLexicalItemExclusionFromLearning: home_core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      generateCardInfo: sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
      learningContentRepository: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ExposeRepetitionAnswerSelectionObscureCard>(() {
    return ExposeRepetitionAnswerSelectionObscureCardImpl(
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
      imageService: core_di.sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ExposeUnspecifiedLexicalItemObscureCard>(() {
    return ExposeUnspecifiedLexicalItemObscureCardImpl(
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
      imageService: core_di.sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<GetInitialData>(() {
    return GetInitialDataImpl(
      generateCardInfo: sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleAvailableEmailAppOuterUpdate>(() {
    return HandleAvailableEmailAppOuterUpdateImpl(
      getMemorizationCardActions: sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
    );
  });

  sl.registerLazySingleton<HandleCachedImagePageMapOuterUpdate>(() {
    return HandleCachedImagePageMapOuterUpdateImpl(
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleDialectOuterUpdate>(() {
    return HandleDialectOuterUpdateImpl(
      isLexicalItemSafeToPronounce: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleImageSettingsOuterUpdate>(() {
    return HandleImageSettingsOuterUpdateImpl(
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
      imageService: core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleLearningContentOuterUpdate>(() {
    return HandleLearningContentOuterUpdateImpl(
      getMemorizationCardActions: sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
      isLexicalItemRepeatable: home_core_di.sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      getRepeatableLexicalItems: learning_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandlePremiumAccessStatusOuterUpdate>(() {
    return HandlePremiumAccessStatusOuterUpdateImpl(
      getMemorizationCardActions: sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      getPermittedCollectionListItemIds: home_core_di.sl(),
      getPermittedLexicalItemIds: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleRepetitionAnswerTypingCardCorrectAnswer>(() {
    return HandleRepetitionAnswerTypingCardCorrectAnswerImpl(
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      imageService: core_di.sl(),
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      applyLexicalItemMarkAsRemembered: sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<HandleRepetitionAnswerTypingCardHintUsage>(() {
    return HandleRepetitionAnswerTypingCardHintUsageImpl(
      handleLearningActivity: core_di.sl(),
    );
  });

  sl.registerLazySingleton<Initialize>(() {
    return InitializeImpl(
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      getCardInfoLexicalItem: sl(),
      imageService: core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
    );
  });

  sl.registerLazySingleton<MarkRepetitionAnswerSelectionExposedCardLexicalItemAsBadlyRemembered>(
      () {
    return MarkRepetitionAnswerSelectionExposedCardLexicalItemAsBadlyRememberedImpl(
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsBadlyRemembered: sl(),
    );
  });

  sl.registerLazySingleton<MarkRepetitionAnswerSelectionExposedCardLexicalItemAsCompletelyLearned>(
      () {
    return MarkRepetitionAnswerSelectionExposedCardLexicalItemAsCompletelyLearnedImpl(
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsCompletelyLearned: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<MarkRepetitionAnswerSelectionExposedCardLexicalItemAsRemembered>(() {
    return MarkRepetitionAnswerSelectionExposedCardLexicalItemAsRememberedImpl(
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsRemembered: sl(),
    );
  });

  sl.registerLazySingleton<MarkRepetitionAnswerSelectionExposedCardLexicalItemAsUnremembered>(() {
    return MarkRepetitionAnswerSelectionExposedCardLexicalItemAsUnrememberedImpl(
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsUnremembered: sl(),
    );
  });

  sl.registerLazySingleton<MarkRepetitionAnswerTypingCardLexicalItemAsUnremembered>(() {
    return MarkRepetitionAnswerTypingCardLexicalItemAsUnrememberedImpl(
      getMemorizationCardActions: sl(),
      isLexicalItemSafeToPronounce: home_core_di.sl(),
      imageService: core_di.sl(),
      getLexicalItemEffectiveImagePath: home_core_di.sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsUnremembered: sl(),
    );
  });

  sl.registerLazySingleton<MarkUnspecifiedLexicalItemExposedCardLexicalItemAsKnown>(() {
    return MarkUnspecifiedLexicalItemExposedCardLexicalItemAsKnownImpl(
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsKnown: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<MarkUnspecifiedLexicalItemExposedCardLexicalItemAsUnknown>(() {
    return MarkUnspecifiedLexicalItemExposedCardLexicalItemAsUnknownImpl(
      getUnspecifiedLexicalItemExposedCardActions: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoLexicalItem: sl(),
      generateCardInfo: sl(),
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      applyLexicalItemMarkAsUnknown: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<MaybeAutoPronounceMemorizationCardLexicalItem>(() {
    return MaybeAutoPronounceMemorizationCardLexicalItemImpl(
      ttsService: core_di.sl(),
    );
  });

  sl.registerLazySingleton<MaybeAutoPronounceRepetitionAnswerSelectionExposedCardLexicalItem>(() {
    return MaybeAutoPronounceRepetitionAnswerSelectionExposedCardLexicalItemImpl(
      ttsService: core_di.sl(),
    );
  });

  sl.registerLazySingleton<MaybeAutoPronounceUnspecifiedLexicalItemObscureCardLexicalItem>(() {
    return MaybeAutoPronounceUnspecifiedLexicalItemObscureCardLexicalItemImpl(
      ttsService: core_di.sl(),
    );
  });

  sl.registerLazySingleton<ReportMemorizationCardLexicalItemMistakeByEmail>(() {
    return ReportMemorizationCardLexicalItemMistakeByEmailImpl(
      emailService: core_di.sl(),
      getLexicalItemMistakeReportEmailBody: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<ReportRepetitionAnswerSelectionExposedCardLexicalItemMistakeByEmail>(() {
    return ReportRepetitionAnswerSelectionExposedCardLexicalItemMistakeByEmailImpl(
      emailService: core_di.sl(),
      getLexicalItemMistakeReportEmailBody: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<ReportUnspecifiedLexicalItemExposedCardLexicalItemMistakeByEmail>(() {
    return ReportUnspecifiedLexicalItemExposedCardLexicalItemMistakeByEmailImpl(
      emailService: core_di.sl(),
      getLexicalItemMistakeReportEmailBody: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<ResetMemorizationCardLexicalItemProgress>(() {
    return ResetMemorizationCardLexicalItemProgressImpl(
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      getMemorizationCardActions: sl(),
      applyLexicalItemProgressReset: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<ResetRepetitionAnswerSelectionExposedCardLexicalItemProgress>(() {
    return ResetRepetitionAnswerSelectionExposedCardLexicalItemProgressImpl(
      learningContentRepository: core_di.sl(),
      handleLearningActivity: core_di.sl(),
      applyLexicalItemUpdate: home_core_di.sl(),
      getRepetitionAnswerSelectionExposedCardActions: sl(),
      applyLexicalItemProgressReset: home_core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      generateCardInfo: sl(),
      getCardInfoLexicalItem: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
    );
  });

  sl.registerLazySingleton<SkipUnspecifiedLexicalItemExposedCard>(() {
    return SkipUnspecifiedLexicalItemExposedCardImpl(
      handleLearningActivity: core_di.sl(),
      maybeBuildTrainingLexicalItems: learning_core_di.sl(),
      generateCardInfo: sl(),
      getCardInfoLexicalItem: sl(),
      getCardInfoRepeatableLexicalItemId: sl(),
      getCardInfoUnspecifiedLexicalItemId: sl(),
      maybeStartLexicalItemImageDownload: home_core_di.sl(),
    );
  });
}
